#ifndef ZhangsNotWindows_H
#define ZhangsNotWindows_H
#include"sys/Memory.h"
// 宏定义
#define MAX_JOB_N 100           //max job num 最大PCB数量
#define MAX_NEWQ_N 100          //max new num 最大等待创建进程数量          
#define MAX_WAITINGQ_N 100      //max waitpid num 最大等待子进程终止的父进程数量      
#define MAX_READY_N 10          //max ready num 最大等待CPU资源数量          
#define MAX_PROCESS_N 9         //max process内存中能同时运行多少个process
#define CORE_N 1                //核数             
#define MAXINS 1000             //系统一次性可接受指令最大数量
#define INSNUM 9               //系统可接受指令种类
#define MAX_RESOURCE_NUM 6      //系统资源种类数
#define RR_STIME 10

#define GPR_MAX 16
typedef unsigned long long uint64;
// 结构体和枚举类型声明
// 优先队列结构体
typedef struct {
    int array[MAX_READY_N];
    int maxsize;
    int size;
    int head;
    int tail;
    int * occupy;
} PriorityQueue;

// 进程状态枚举
typedef enum {
    NEW,
    READY,
    RUNNING,
    WAITING,
    TERMINATED
} ProcessState;

typedef struct ProcessLNode{
    int id;
    struct ProcessLNode* next_id;
} ProcessLNode;

// 进程操作枚举
typedef enum{
    POP_ARIV=0,
    POP_END ,
    POP_FORK,
    POP_KILL,
    POP_WAITP,   //wait_pid
    POP_SETP,    //set_priority
    POP_APPL,    //apply for resources
    POP_RELS,    //release resources
    //POP_PFLT   //page fault
} ProcessOperation;

typedef struct JobActNode{
    int time;
    ProcessOperation op;
    int param;
    struct JobActNode* next;
} JobActNode;

typedef struct {
    int id; // 表示其在Processes表中索引, -1表示未使用
    int pa_id; // 父进程id
    ProcessLNode* ch_id; // 子进程id，用链表表示
    int priority;               // 优先级
    ProcessState state;         // 当前进程状态
    int marker;  //标记是否有父进程等待它结束
    int exit_val; // 退出返回值;
    int arrive_time; // 到达时间
    int start_time;             // 开始执行的时间
    int completion_time;        // 完成执行的时间
    int resource_requests[MAX_RESOURCE_NUM]; // 总共的资源请求数组
    int resource_remain[MAX_RESOURCE_NUM];  //  还需要申请哪些资源
    JobActNode * pc;
    PageTable *PTB;
    uint64 GPRs[GPR_MAX];//通用寄存器组。
    uint64 sp;//stack pointer指向栈顶指针，定义用户逻辑内存下界
    uint64 hp;//heap pointer指向堆顶的指针，定义用户逻辑内存上界
    int page_fault_cnt, page_find_cnt;//记录程序缺页错误率，由MMU主程序记录
    int allocated_frames;//记录程序已分配的页数，用于FrameAllocators
} Process;

typedef enum {
    FCFS,       // 先来先服务
    PSA,        // 优先级调度
    SJF         // 最短任务优先
} Algorithm;

// 退出状态枚举
typedef enum {
    EXIT_NORMALLY = 0,              // 正常退出
    EXIT_KILLED_BY_PARENTS,     // 被父进程终止
    EXIT_ENDLESS_ERROR,         // 异常退出，原因是最后一条指令不是exit
    EXIT_SEGEMENT_ERROR         // 异常退出，原因是段错误
} ExitVal;

// 指令结构体
typedef struct Instruction{
    int time;
    int pid;
    char command[15];
    int j;
} Instructions;

// 到达节点结构体
typedef struct ArriveNode{
    int pid;
    int time;
} _Arrive;

// 全局变量声明
extern int vac[MAX_JOB_N];
extern PriorityQueue Ready;
extern PriorityQueue sleep[MAX_RESOURCE_NUM];
extern int Remain[MAX_RESOURCE_NUM];
extern const int rsc_num[MAX_RESOURCE_NUM];
extern PriorityQueue New;
extern PriorityQueue waitpid_q;
extern JobActNode* jobActs[MAX_JOB_N];
extern Process jobs[MAX_JOB_N];
extern int Running[CORE_N];
extern int procN;
extern _Arrive arrive_q[MAX_JOB_N];
extern int arrive_n;
extern const char ins[INSNUM][5];
extern Instructions Ins[1];

#endif